<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="Generator" content="EditPlus®">
    <meta name="Author" content="">
    <meta name="Keywords" content="">
    <meta name="Description" content="">
    <title>Document</title>
</head>
<body>
1.hashset和hashmap比较<br/>
  （1）hashset实现了Set接口，使用add方法存储对象。不允许出现重复对象，如果要
  <br/>
  比较对象的相等，要重写hashCode和equals方法。HashSet较HashMap慢。
  <br/>
  （2）HashMap实现了Map接口，键值对存储。键不允许重复，重复会覆盖。HashMap使用键计算
  <br/>
  Hashcode。HashMap相对于HashSet较快，因为它是使用唯一的键获取对象。
  <br/>
  （3）Map接口有两个基本的实现TreeMap和HashMap。TreeMap保存了对象的排列次序，而HashMap不能。
  <br/>
       HashMap是线程不安全的，要实现线程安全，需要调用collections类的静态方法synchronizeMap实现。
  <br/>
       TreeMap是线程不安全的。TreeMap使用红黑树实现，HashMap使用hash实现。TreeMap有序，hashMap随机。
	   hashMap较TreeMap快，可以快速插入、删除、定位。TreeMap适合有序遍历。
  <br/>

 2.mysql数据库两种引擎的比较
  (1).MyISAM 和InnoDB
  (2).InnoDB支持事物commit、回滚rollback和崩溃修复能力的事物安全型表；支持外键；
      InnoDB中不保存表的具体行数，也就是说，执行select count(*) from table时，InnoDB会进行
	  全表扫描。
  (3).MyISAM 不支持事务操作；不支持外键；MyISAM保存表的具体行数，执行select count(*) from table时只要简单的读出保存好的行数即可。MySQL表级锁有两种模式：表共享读锁（Table Read Lock）和表独占写锁（Table Write Lock）。什么意思呢，就是说对MyISAM表进行读操作时，它不会阻塞其他用户对同一表的读请求，但会阻塞对同一表的写操作；而对MyISAM表的写操作，则会阻塞其他用户对同一表的读和写操作。
  (4).InnoDB具有提交、回滚、奔溃恢复能力的事务安全。与Myisam相比，InnoDB的写效率差一些并且会占用更多的磁盘空间以保留数据和索引。
 3.hibernate和mybaits的比较
   Hibernate优势
		Hibernate的DAO层开发比MyBatis简单，Mybatis需要维护SQL和结果映射。

		Hibernate对对象的维护和缓存要比MyBatis好，对增删改查的对象的维护要方便。

		Hibernate数据库移植性很好，MyBatis的数据库移植性不好，不同的数据库需要写不同SQL。

		Hibernate有更好的二级缓存机制，可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

   Mybatis优势
		MyBatis可以进行更为细致的SQL优化，可以减少查询字段。

		MyBatis容易掌握，而Hibernate门槛较高。
  4.常见优化Sql查询性能的方法有哪些？
    (1).查询条件，减少使用函数，避免全表扫描
	(2).减少不必要的表连接
	(3).用exists代替in
	(4).表关联时，给表取别名。
	(5).对查询优化，应尽量避免全表扫描，首先考虑在where及order by涉及的列上添加索引。
	(6).避免在where子句中对null值判断，创建表时，字段要尽量设置为not null或者设置默认值。
	(7).应尽量避免在 where 子句中使用!=或<>操作符
	(8).应尽量避免在where子句中使用or来连接条件，否则将导致引擎放弃使用索引而进行全表扫描，可以使用uion.
	(9).当有一批处理的插入或更新时，用批量插入或批量更新，绝不会一条条记录的去更新!
39，索引创建规则： 
表的主键、外键必须有索引； 
数据量超过300的表应该有索引； 
经常与其他表进行连接的表，在连接字段上应该建立索引； 
经常出现在Where子句中的字段，特别是大表的字段，应该建立索引； 
索引应该建在选择性高的字段上； 
索引应该建在小字段上，对于大的文本字段甚至超长字段，不要建索引； 
复合索引的建立需要进行仔细分析，尽量考虑用单字段索引代替； 
正确选择复合索引中的主列字段，一般是选择性较好的字段； 
复合索引的几个字段是否经常同时以AND方式出现在Where子句中？单字段查询是否极少甚至没有？如果是，则可以建立复合索引；否则考虑单字段索引； 
如果复合索引中包含的字段经常单独出现在Where子句中，则分解为多个单字段索引； 
如果复合索引所包含的字段超过3个，那么仔细考虑其必要性，考虑减少复合的字段； 
如果既有单字段索引，又有这几个字段上的复合索引，一般可以删除复合索引； 
频繁进行数据操作的表，不要建立太多的索引； 
删除无用的索引，避免对执行计划造成负面影响； 
表上建立的每个索引都会增加存储开销，索引对于插入、删除、更新操作也会增加处理上的开销。另外，过多的复合索引，在有单字段索引的情况下，一般都是没有存在价值的；相反，还会降低数据增加删除时的性能，特别是对频繁更新的表来说，负面影响更大。 
尽量不要对数据库中某个含有大量重复的值的字段建立索引。
</body>
</html>
